//
//  Emoticon.swift
//  test
//
//  Created by weixq on 15/8/13.
//  Copyright © 2015年 weixq. All rights reserved.
//

import UIKit
    /*
        1. Emoticons.bundle（存放表情的bundle目录） 的根目录中有一个emoticons.plist
                emoticons.plist 中元素：
                    - packages [array]
                        - items [dict]
                            - id [string] 包名
                            - version 无用
                            - display 无用
        2. 每一套表情目录下有一个info.plist文件
                group_name_cn 记录的表情包得名字  id的值
                emoticons 数组 记录的整套表情的数组
        3. 表情字典信息 emoticon
                chs： 定义的发布微博以及网络传输的使用的微博文字字符串
                png： 在客户端显示的图片名称
                
                code： emoji要显示的16禁止的字符串
    */

// 表情数据包模型
class EmoticonPackage: NSObject {
    
    // 目录名
    var id: String
    // 分组名
    var groupName: String = ""
    // 表情数组
    var emoticons: [Emoticon]?
    // 默认值可以做到对之前代码不做任何调整
    init(id: String, groupName: String = "") {
        self.id = id
        self.groupName = groupName
    }
    
    // 仅是内存排序
    class func addFavorate(emoticon: Emoticon) {
        // 0. 判断是否是删除按钮
        if emoticon.removeEmoticon {
            return
        }
        
        // 1. 拿到第0个分组包得数组
        var ems = packages[0].emoticons
        // 1.1 删除删除按钮，后续对数组的操作，删除按钮不参与
        ems?.removeLast()
        
        // 2. 递增表情的使用次数
        emoticon.times++
        
        // 3. 添加emoticon
        // 3.1 判断数组中是否包含表情
        let contains = ems!.contains(emoticon)
        if !contains {
            ems!.append(emoticon)
        }
        
        // 4. 排序表情数组
//        ems = ems!.sort({ (e1, e2) -> Bool in
//            return e1.times > e2.times
//        })
        // 排序的简写 
        ems = ems!.sort({
            return $0.times > $1.times
        })
        
        // 5. 将末尾的表情删掉
        if !contains {
            ems?.removeLast()
        }
        // 5.1 重新追加删除按钮
        ems?.append(Emoticon(remove: true))
        
        // 6. 重新设置表情数组
        packages[0].emoticons = ems
        
        print("\(ems)数组数量\(ems!.count)")
    }
    
    // 使用静态常量只允许被设置一次数值，变量的写法和单例几乎一致
    static let packages = EmoticonPackage.loadPackages()
    
    // 加载所有的表情包- 每次都会被撰写微博控制器重复加载
    // 但是表情包得使用频率非常高
   private class func loadPackages() -> [EmoticonPackage] {
        // 1. 加载路径
        let path = bundlePath.stringByAppendingPathComponent("emoticons.plist")
        
        // 2. 加载plist
        let dict = NSDictionary(contentsOfFile: path)!
        let array = dict["packages"] as! [[String: AnyObject]]
        
        var arrayM = [EmoticonPackage]()
        
        // 插入最近表情包
        let backage = EmoticonPackage(id: "", groupName: "最近").appendEmptyEmoticon()
        arrayM.append(backage)
        
        // 3. 遍历数组
    
        for d in array {
            let id = d["id"] as! String
            // 链式响应
            let package = EmoticonPackage(id: id).loadEmoticons().appendEmptyEmoticon()
            arrayM.append(package)
        }
        
        return arrayM
    }
    
   private func loadEmoticons() -> Self {
        // 1. 路径
        let path  = EmoticonPackage.bundlePath.stringByAppendingPathComponent(id).stringByAppendingPathComponent("info.plist")
        let dict = NSDictionary(contentsOfFile: path)!
        
        
        
        groupName = dict["group_name_cn"] as! String
        let array = dict["emoticons"] as! [[String: String]]
        
        // 2. 遍历数组 - 每隔20个表情，插入一个“删除”表情
        emoticons = [Emoticon]()
        
        var index = 0
        for d in array {
            // 将表情包得 id 传递给表情，方便拼接路径
            emoticons?.append(Emoticon(id: id,dict: d))
            
            index++
            // 插入删除表情
            if index == 20 {
                emoticons?.append(Emoticon(remove: true))
                index = 0
            }
            
        }
        
        return self
    }
    
    // 在表情数组中追加空白表情 - 如果一页不是21个表情，追加空白表情，并且最后一个放删除按钮
   private func appendEmptyEmoticon() -> Self {

        // 判断表情数组是否存在
        if emoticons == nil{  // 最近分组
            emoticons = [Emoticon]()
        }
        
        // 判断是否整页
        let count = (emoticons?.count)! % 21
        print("已经有\(count)个表情")
        // count等于0的适合不需要追加，表示整页
        if count > 0  || emoticons?.count == 0  {
            for _ in count..<20 {
                emoticons?.append(Emoticon(remove: false))
            }
            // 最末尾追加一个删除按钮
            emoticons?.append(Emoticon(remove: true))
        }
        return self
    }
        
   private static let bundlePath = NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent("Emoticons.bundle")
    
    override var description: String {
        return "\(id)-\(groupName)-\(emoticons)"
    }
    
}

/// 表情模型
class Emoticon: NSObject {
    // 表情目录字符串
    var id:String?
    // 发送给服务器的表情文字
    var chs: String?
    // 本地显示的图片文件名
    var png: String?
    // 图片完整路径
    var imagePath: String {
        // boudlepath + id + png
        // 判断是否是图片表情
        if chs == nil {
            return ""
        }
       return EmoticonPackage.bundlePath.stringByAppendingPathComponent(id!).stringByAppendingPathComponent(png!)
    }
    
    // emoji的代码
    var code: String? {
        didSet{
            // 扫描器
            let scanner = NSScanner(string: code!)
            
            var value: UInt32 = 0
            scanner.scanHexInt(&value)
            
            emoji = String(Character(UnicodeScalar(value)))
        }
    }
    // emoji 字符串
    var emoji:String?
    
    // 删除表情标记
    var removeEmoticon = false
    // 表情使用次数
    var times = 0
    init(remove: Bool) {
        removeEmoticon = remove
    }
    
    init(id: String, dict: [String: String]) {
        self.id = id
        super.init()
        
        setValuesForKeysWithDictionary(dict)
    }

    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    override var description: String {
        return "\(chs)\(png)\(code)\(removeEmoticon)"
    }
}
